const array = [1, 1, '1', '1', null, null, undefined, undefined, new String('1'), new String('1'), /a/, /a/, NaN, NaN];

const unique1 = function (arr) { //对象不去重。NaN可以去掉
  return [...new Set(arr)];
};

// console.log(unique1(array));

const unique2 = function (arr) { //全部去重
  const obj = {};
  return arr.filter((item) => {
    if (obj.hasOwnProperty(typeof item + item)) {
      return false;
    }
    obj[typeof item + item] = true;
    return true;
  });
};

// console.log(unique2(array));

const unique3 = function (arr) { //不等的去掉，NaN与正则都会留下
  for (let i = 0, len = arr.length; i < len; i++) {
    for (let j = i + 1; j < len; j++) {
      if (arr[i] === arr[j]) {
        arr.splice(j, 1);
        // splice 会改变数组长度，所以要将数组长度 len 和下标 j 减一
        len--;
        j--;
      }
    }
  }
  return arr;
};

// console.log(unique3(array));

const unique4 = function (arr) { //相邻元素去重
  var res = [];
  var sortedArray = arr.concat().sort();
  var seen;
  for (var i = 0, len = sortedArray.length; i < len; i++) {
    // 如果是第一个元素或者相邻的元素不相同
    if (!i || seen !== sortedArray[i]) {
      res.push(sortedArray[i])
    }
    seen = sortedArray[i];
  }
  return res;
};

// console.log(unique4(array));

let arr1 = Array.from(new Array(100000), (x, index)=>{
  return Math.random();
});

const func = function (arr) {
  console.time('a');
  unique1(arr);
  console.timeEnd('a');

  console.time('b');
  unique2(arr);
  console.timeEnd('b');

  console.time('c');
  unique3(arr);
  console.timeEnd('c');

  console.time('d');
  unique4(arr);
  console.timeEnd('d');
};

// func(arr1);

let arr2 = Array.from(new Array(50000), (x, index)=>{
  return Math.random();
});
func(arr2);

let arr3 = Array.from(new Array(200), (x, index)=>{
  return Math.random();
});
func(arr3);

let arr4 = Array.from(new Array(100), (x, index)=>{
  return Math.random();
});
func(arr4);

//运算结果上看，一般是：
//a<b<d<c
